//本次简单的了解一下STL,方便之后的刷题和进度
#include<iostream>
using namespace std;
#include<vector>
#include <algorithm>
void test_01(){
    // 1.vector初始化
    vector<int> a(10);   //构造函数,(这是没有定义的行为，向量是空的),默认是）
    // 1.1 可以通过数组来赋值，
    for (int i = 0; i < 10;i++){
        a[i] = i;
        cout << a[i];
    }
    // 1.2 一般是通过迭代器
    for (vector<int>::iterator it = a.begin(); it < a.end();it++){   //推荐使用
        a.push_back(*it);
    }

    // 2.1常见的赋值操作
    vector<int> b(10, 1); //容量为10,值为1
    vector<int> c(b);     //b的值赋值给c
    vector<int> d(b.begin(), b.begin() + 3);   //b的0-2的值赋值给d

    // 2.2 还可以数组直接赋值
    int arr[5] = {1, 2, 3, 4, 5};
    vector<int> e(arr, arr + 5);     //效果一样
}
// 常用的vector的内置函数
void test_02(){
    vector<int> a(10,1),b(1);
    // 1.赋值函数 b.assign()
    b.assign(a.begin(), a.begin() + 3);
    b.assign(4, 2);                          // b中含有4个为2的元素
    for (auto it = b.begin(); it < b.end();it++){
        cout << *it;
    }
    cout << endl;

    // 2.b.front() 和 b.back() 和 b[i]  分别是:返回第一个元素 最后一个 任意一个
    cout << b.front() << b.back() << b[2] << endl;
    ; //输出：222

    // 3.清空:b.clear() 判空:b.emty()  b.pop_back():删除最后一个元素 
    //b.arase(b.begin(),b.begin()+3):删除0-2个元素
    // 3.1清空函数
    b.clear();
    for (auto it = b.begin(); it < b.end(); it++)
    {
        cout << "b.clear() = " << *it << endl;   //已经为空了：进不去循环里面
    }
    cout << "b.empty() = b" << b.empty();

    //3.2重新分配一下
    b.assign(4, 3);
    b.erase(b.begin(), b.begin() + 2);
    b.pop_back();
    cout << "b.erase(b.begin(), b.begin() + 2) = " ;
    for (auto it = b.begin(); it < b.end(); it++)
    {
        cout << *it;          // 3333 --> 删除了两个(0-1) 然后剩了两个33 然后又删除了最后一个3 最后只有一个3
    }
    cout << endl;

    // 4.b.push_back():最后位置插入 b.insert(a.begin()+1,5):在第二个位置插入5
    // b.insert(a.begin()+1,3,5):在第二个位置插入3个5  a.insert(a.begin()+1,b+3,b+6);
    a.assign(5, 1);
    b.assign(5, 2);
    a.push_back(4);
    a.insert(a.begin() + 1, 3);   //在第二个位置插入3
    for (auto it = a.begin(); it < a.end(); it++)
    {
        cout << *it;     //结果：1311114
    }
    cout << endl;
    b.insert(b.begin() + 1, 3, 6); //在第二个位置插入3个6
    for (auto it = b.begin(); it < b.end(); it++)
    {
        cout << *it;     //结果26662222
    }
    cout << endl;
    a.assign(5, 1);
    b.assign(5, 2);
    a.insert(a.begin() + 1, b.begin()+ 2, b.begin() + 4);    //插入b中的3-4个元素,不包括b.begin()+4,数组也是
    for (auto it = a.begin(); it < a.end(); it++)
    {
        cout << *it; //结果：1221111
    }
    cout << endl;

    // 5.a.size():元素个数  a.capacity():返回a在内存中总共可以容纳的元素个数
    // a.resize(10):将a的现有元素个数调整至10个，多则删，少则补，其值为随机
    //a.reserve(100);将a的容量扩充至100
    a.assign(5, 1);           // 别忘了前面的初始化:vector<int> a(10,1),b(1);
    b.assign(5,2);
    cout << "a.size() = " << a.size() << "  a.capacity() = " << a.capacity() << endl;
    a.resize(10);
    a.reserve(100);
    cout << "a.resize(10) = " << a.size() << "  a.reserve(100) = " << a.capacity() << endl;

    ////b为向量，将a中的元素和b中的元素整体交换
    a.swap(b);
    // b为向量，向量的比较操作还有 != >= > <= <
    //a == b;
}
//一些常用算法
void test_03(){
    vector<int> a(10, 1), b(10);

    //对a中的从a.begin()（包括它）到a.end()（不包括它）的元素进行从小到大排列
    sort(a.begin(), a.end());
    //对a中的从a.begin()（包括它）到a.end()（不包括它）的元素倒置，但不排列，如a中元素为1,3,2,4,倒置后为4,2,3,1
    reverse(a.begin(), a.end());
    //把a中的从a.begin()（包括它）到a.end()（不包括它）的元素复制到b中，从b.begin()+1的位置（包括它）开始复制，覆盖掉原有元素
    copy(a.begin(), a.end(), b.begin() + 1);
    //在a中的从a.begin()（包括它）到a.end()（不包括它）的元素中查找10，若存在返回其在向量中的位置
    find(a.begin(), a.end(), 10);
}
int main(){
    //test_01();
    test_02();

    return 0;
}